<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><title>八股文 --- Java基础 | FATE</title><meta name="keywords" content="Java基础,面试"><meta name="author" content="MoYu-zc"><meta name="copyright" content="MoYu-zc"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta http-equiv="Cache-Control" content="no-transform"><meta http-equiv="Cache-Control" content="no-siteapp"><meta name="description" content="八股文 — Java基础 本篇是常见的Java基础八股文，后续我面试遇到会继续补充的。。。  1、java的8种基本类型 布尔型 :      boolean  字符型 :      char  整数型 :      byte, short, int, long  浮点数型 :  float, double  2、 装箱和拆箱 自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的">
<meta property="og:type" content="article">
<meta property="og:title" content="八股文 --- Java基础">
<meta property="og:url" content="http://example.com/2021/06/23/%E5%85%AB%E8%82%A1%E6%96%87%20---%20Java%E5%9F%BA%E7%A1%80/index.html">
<meta property="og:site_name" content="FATE">
<meta property="og:description" content="八股文 — Java基础 本篇是常见的Java基础八股文，后续我面试遇到会继续补充的。。。  1、java的8种基本类型 布尔型 :      boolean  字符型 :      char  整数型 :      byte, short, int, long  浮点数型 :  float, double  2、 装箱和拆箱 自动装箱是 Java 编译器在基本数据类型和对应的对象包装类型之间做的">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://gitee.com/MoYu-zc/picgo/raw/master/img/20210219145449.jpg">
<meta property="article:published_time" content="2021-06-22T16:00:00.000Z">
<meta property="article:modified_time" content="2021-06-23T16:01:02.530Z">
<meta property="article:author" content="MoYu-zc">
<meta property="article:tag" content="Java基础">
<meta property="article:tag" content="面试">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://gitee.com/MoYu-zc/picgo/raw/master/img/20210219145449.jpg"><link rel="shortcut icon" href="/img/favicon.png"><link rel="canonical" href="http://example.com/2021/06/23/%E5%85%AB%E8%82%A1%E6%96%87%20---%20Java%E5%9F%BA%E7%A1%80/"><link rel="preconnect" href="//cdn.jsdelivr.net"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free/css/all.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.css"><script>var GLOBAL_CONFIG = { 
  root: '/',
  hexoversion: '5.2.0',
  algolia: undefined,
  localSearch: {"path":"search.xml","languages":{"hits_empty":"找不到您查询的内容：${query}"}},
  translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
  noticeOutdate: undefined,
  highlight: {"plugin":"highlighjs","highlightCopy":true,"highlightLang":true},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  date_suffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  ClickShowText: undefined,
  lightbox: 'fancybox',
  Snackbar: {"chs_to_cht":"你已切换为繁体","cht_to_chs":"你已切换为简体","day_to_night":"你已切换为深色模式","night_to_day":"你已切换为浅色模式","bgLight":"#49b1f5","bgDark":"#121212","position":"top-right"},
  justifiedGallery: {
    js: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/js/jquery.justifiedGallery.min.js',
    css: 'https://cdn.jsdelivr.net/npm/justifiedGallery/dist/css/justifiedGallery.min.css'
  },
  isPhotoFigcaption: false,
  islazyload: true,
  isanchor: false
};

var saveToLocal = {
  set: function setWithExpiry(key, value, ttl) {
    const now = new Date()
    const expiryDay = ttl * 86400000
    const item = {
      value: value,
      expiry: now.getTime() + expiryDay,
    }
    localStorage.setItem(key, JSON.stringify(item))
  },

  get: function getWithExpiry(key) {
    const itemStr = localStorage.getItem(key)

    if (!itemStr) {
      return undefined
    }
    const item = JSON.parse(itemStr)
    const now = new Date()

    if (now.getTime() > item.expiry) {
      localStorage.removeItem(key)
      return undefined
    }
    return item.value
  }
}</script><script id="config_change">var GLOBAL_CONFIG_SITE = { 
  isPost: true,
  isHome: false,
  isHighlightShrink: false,
  isSidebar: true,
  postUpdate: '2021-06-24 00:01:02'
}</script><noscript><style type="text/css">
  #nav {
    opacity: 1
  }
  .justified-gallery img {
    opacity: 1
  }

  #recent-posts time,
  #post-meta time {
    display: inline !important
  }
</style></noscript><script>(function () {
  window.activateDarkMode = function () {
    document.documentElement.setAttribute('data-theme', 'dark')
    if (document.querySelector('meta[name="theme-color"]') !== null) {
      document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
    }
  }
  window.activateLightMode = function () {
    document.documentElement.setAttribute('data-theme', 'light')
    if (document.querySelector('meta[name="theme-color"]') !== null) {
      document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
    }
  }

  const autoChangeMode = 'false'
  const t = saveToLocal.get('theme')
  if (autoChangeMode === '1') {
    const isDarkMode = window.matchMedia('(prefers-color-scheme: dark)').matches
    const isLightMode = window.matchMedia('(prefers-color-scheme: light)').matches
    const isNotSpecified = window.matchMedia('(prefers-color-scheme: no-preference)').matches
    const hasNoSupport = !isDarkMode && !isLightMode && !isNotSpecified

    if (t === undefined) {
      if (isLightMode) activateLightMode()
      else if (isDarkMode) activateDarkMode()
      else if (isNotSpecified || hasNoSupport) {
        const now = new Date()
        const hour = now.getHours()
        const isNight = hour <= 6 || hour >= 18
        isNight ? activateDarkMode() : activateLightMode()
      }
      window.matchMedia('(prefers-color-scheme: dark)').addListener(function (e) {
        if (saveToLocal.get('theme') === undefined) {
          e.matches ? activateDarkMode() : activateLightMode()
        }
      })
    } else if (t === 'light') activateLightMode()
    else activateDarkMode()
  } else if (autoChangeMode === '2') {
    const now = new Date()
    const hour = now.getHours()
    const isNight = hour <= 6 || hour >= 18
    if (t === undefined) isNight ? activateDarkMode() : activateLightMode()
    else if (t === 'light') activateLightMode()
    else activateDarkMode()
  } else {
    if (t === 'dark') activateDarkMode()
    else if (t === 'light') activateLightMode()
  }
})()</script><link rel="stylesheet" href="/css/iconfont.css"><link rel="stylesheet" href="/css/mycss.css"><meta name="generator" content="Hexo 5.2.0"><link rel="alternate" href="/atom.xml" title="FATE" type="application/atom+xml">
</head><body><div id="mobile-sidebar"><div id="menu_mask"></div><div id="mobile-sidebar-menus"><div class="mobile_author_icon"><img class="avatar-img" data-lazy-src="/img/tit.png" onerror="onerror=null;src='/img/friend_404.gif'" alt="avatar"/></div><div class="mobile_post_data"><div class="mobile_data_item is-center"><div class="mobile_data_link"><a href="/archives/"><div class="headline">文章</div><div class="length_num">39</div></a></div></div><div class="mobile_data_item is-center">      <div class="mobile_data_link"><a href="/tags/"><div class="headline">标签</div><div class="length_num">40</div></a></div></div><div class="mobile_data_item is-center">     <div class="mobile_data_link"><a href="/categories/"><div class="headline">分类</div><div class="length_num">22</div></a></div></div></div><hr/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fa fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fa fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fa fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fa fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/messageboard/"><i class="fa-fw fa fa-paper-plane"></i><span> 留言板</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fa fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/timeline/"><i class="fa-fw fa fa-bell"></i><span> 日志</span></a></div><div class="menus_item"><a class="site-page" href="/myself/"><i class="fa-fw fa fa-address-card"></i><span> myself</span></a></div><div class="menus_item"><a class="site-page" target="_blank" rel="noopener" href="https://www.moyuzc.cn/"><i class="fa-fw fa fa-home"></i><span> Vuepress</span></a></div></div></div></div><div id="body-wrap"><div id="web_bg"></div><div id="sidebar"><i class="fas fa-arrow-right on" id="toggle-sidebar"></i><div class="sidebar-toc"><div class="sidebar-toc__title">目录</div><div class="sidebar-toc__progress"><span class="progress-notice">你已经读了</span><span class="progress-num">0</span><span class="progress-percentage">%</span><div class="sidebar-toc__progress-bar">     </div></div><div class="sidebar-toc__content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%85%AB%E8%82%A1%E6%96%87-%E2%80%94-Java%E5%9F%BA%E7%A1%80"><span class="toc-text">八股文 — Java基础</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#1%E3%80%81java%E7%9A%848%E7%A7%8D%E5%9F%BA%E6%9C%AC%E7%B1%BB%E5%9E%8B"><span class="toc-text">1、java的8种基本类型</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#2%E3%80%81-%E8%A3%85%E7%AE%B1%E5%92%8C%E6%8B%86%E7%AE%B1"><span class="toc-text">2、 装箱和拆箱</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#3%E3%80%81String%E6%98%AF%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E5%90%97"><span class="toc-text">3、String是基本数据类型吗?</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#4%E3%80%81String%E7%B1%BB%E5%9E%8B%E5%8F%AF%E5%8F%98%E5%90%97%EF%BC%9F"><span class="toc-text">4、String类型可变吗？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#5%E3%80%81String-%E5%92%8C-StringBuffer-%E5%92%8C-StringBuilder%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-text">5、String 和 StringBuffer 和 StringBuilder的区别？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#6%E3%80%81-%E6%AF%94%E8%BE%83%E7%9A%84%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F-equals-%E6%96%B9%E6%B3%95%E6%98%AF%E5%A6%82%E4%BD%95%E6%AF%94%E8%BE%83%E7%9A%84%EF%BC%9F%E4%B8%A4%E8%80%85%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-text">6、&#x3D;&#x3D;比较的是什么？ equals()方法是如何比较的？两者区别？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#7%E3%80%81-amp-%E5%92%8C-amp-amp-%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-text">7、&amp;和&amp;&amp;的区别？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#8%E3%80%81%E4%BB%80%E4%B9%88%E6%98%AF%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%EF%BC%9F"><span class="toc-text">8、什么是面向对象？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#9%E3%80%81Java%E7%9A%84%E5%9B%9B%E4%B8%AA%E5%9F%BA%E6%9C%AC%E7%89%B9%E6%80%A7%EF%BC%9F"><span class="toc-text">9、Java的四个基本特性？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#10%E3%80%81%E6%8E%A5%E5%8F%A3%E4%B8%8E%E7%BB%A7%E6%89%BF%E7%9A%84%E5%8C%BA%E5%88%AB%E6%9C%89%EF%BC%9F"><span class="toc-text">10、接口与继承的区别有？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#11%E3%80%81%E9%87%8D%E8%BD%BD%E5%92%8C%E9%87%8D%E5%86%99%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-text">11、重载和重写的区别？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#12%E3%80%81abstract-class-%E5%92%8C-interface-%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB"><span class="toc-text">12、abstract class 和 interface 有什么区别?</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#13%E3%80%81Java-%E4%B8%AD%E6%98%AF%E5%90%A6%E5%8F%AF%E4%BB%A5%E8%A6%86%E7%9B%96-override-%E4%B8%80%E4%B8%AA-private-%E6%88%96%E8%80%85%E6%98%AF-static-%E7%9A%84%E6%96%B9%E6%B3%95%EF%BC%9F"><span class="toc-text">13、Java 中是否可以覆盖(override)一个 private 或者是 static 的方法？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#14%E3%80%81final%E3%80%81finally%E3%80%81finalize%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-text">14、final、finally、finalize的区别</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#15%E3%80%81Object-%E4%B8%AD%E6%9C%89%E5%93%AA%E4%BA%9B%E6%96%B9%E6%B3%95%EF%BC%9F"><span class="toc-text">15、Object 中有哪些方法？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#16%E3%80%81%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%85%8B%E9%9A%86-Java%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%B7%B1%E5%BA%A6%E5%85%8B%E9%9A%86%EF%BC%9F"><span class="toc-text">16、怎么实现一个对象的克隆,Java如何实现深度克隆？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#18%E3%80%81-amp-%E5%92%8C-amp-amp-%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F"><span class="toc-text">18、&amp;和&amp;&amp;的区别？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#19%E3%80%81Java-%E5%8F%8D%E5%B0%84"><span class="toc-text">19、Java 反射</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#21%E3%80%81-Error-%E5%92%8C-Exception-%E5%8C%BA%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F"><span class="toc-text">21、 Error 和 Exception 区别是什么？</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#24%E3%80%81-%E5%80%BC%E4%BC%A0%E9%80%92%E4%B8%8E%E5%BC%95%E7%94%A8%E4%BC%A0%E9%80%92"><span class="toc-text">24、 值传递与引用传递</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#25%E3%80%81-%E4%BB%80%E4%B9%88%E6%98%AF%E6%B3%9B%E5%9E%8B%EF%BC%9F-%E6%B3%9B%E5%9E%8B-%EF%BC%9F%E4%B8%8E-T-%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-text">25、 什么是泛型？  泛型 ？与 T 的区别</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#26%E3%80%81%E5%85%AD%E5%8E%9F%E5%88%99%E4%B8%80%E6%B3%95%E5%88%99"><span class="toc-text">26、六原则一法则</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#27%E3%80%81%E5%BA%8F%E5%88%97%E5%8C%96"><span class="toc-text">27、序列化</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#28%E3%80%81comparable-%E6%8E%A5%E5%8F%A3%E5%92%8C-comparator-%E6%8E%A5%E5%8F%A3"><span class="toc-text">28、comparable 接口和 comparator 接口</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#29%E3%80%81%E5%AD%97%E8%8A%82%E6%B5%81%E3%80%81%E5%AD%97%E7%AC%A6%E6%B5%81-%E5%8C%BA%E5%88%AB"><span class="toc-text">29、字节流、字符流 区别</span></a></li><li class="toc-item toc-level-5"><a class="toc-link" href="#30%E3%80%81Comparable-%E5%92%8C-Comparator-%E6%8E%A5%E5%8F%A3%E6%98%AF%E5%B9%B2%E4%BB%80%E4%B9%88%E7%9A%84%EF%BC%9F"><span class="toc-text">30、Comparable 和 Comparator 接口是干什么的？</span></a></li></ol></li></ol></li></ol></li></ol></li></ol></div></div></div><header class="post-bg" id="page-header" style="background-image: url(https://gitee.com/MoYu-zc/picgo/raw/master/img/20210219145449.jpg)"><nav id="nav"><span id="blog_name"><a id="site-name" href="/">FATE</a></span><span id="menus"><div id="search_button"><a class="site-page social-icon search"><i class="fas fa-search fa-fw"></i><span> 搜索</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fa fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fa fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fa fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fa fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/messageboard/"><i class="fa-fw fa fa-paper-plane"></i><span> 留言板</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fa fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/timeline/"><i class="fa-fw fa fa-bell"></i><span> 日志</span></a></div><div class="menus_item"><a class="site-page" href="/myself/"><i class="fa-fw fa fa-address-card"></i><span> myself</span></a></div><div class="menus_item"><a class="site-page" target="_blank" rel="noopener" href="https://www.moyuzc.cn/"><i class="fa-fw fa fa-home"></i><span> Vuepress</span></a></div></div><span class="close" id="toggle-menu"><a class="site-page"><i class="fas fa-bars fa-fw"></i></a></span></span></nav><div id="post-info"><div id="post-title"><div class="posttitle">八股文 --- Java基础</div></div><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2021-06-22T16:00:00.000Z" title="发表于 2021-06-23 00:00:00">2021-06-23</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2021-06-23T16:01:02.530Z" title="更新于 2021-06-24 00:01:02">2021-06-24</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/%E9%9D%A2%E8%AF%95/">面试</a></span></div><div class="meta-secondline"> <span class="post-meta-separator">|</span><span class="post-meta-pv-cv"><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">阅读量:</span><span id="busuanzi_value_page_pv"></span></span></div></div></div></header><main class="layout_post" id="content-inner"><article id="post"><div class="post-content" id="article-container"><h1 id="八股文-—-Java基础"><a href="#八股文-—-Java基础" class="headerlink" title="八股文 — Java基础"></a>八股文 — Java基础</h1><blockquote>
<p><strong>本篇是常见的Java基础八股文，后续我面试遇到会继续补充的。。。</strong></p>
</blockquote>
<h5 id="1、java的8种基本类型"><a href="#1、java的8种基本类型" class="headerlink" title="1、java的8种基本类型"></a>1、java的8种基本类型</h5><blockquote>
<p>布尔型 :      boolean </p>
<p>字符型 :      char </p>
<p>整数型 :      byte, short, int, long </p>
<p>浮点数型 :  float, double</p>
</blockquote>
<h5 id="2、-装箱和拆箱"><a href="#2、-装箱和拆箱" class="headerlink" title="2、 装箱和拆箱"></a>2、 装箱和拆箱</h5><blockquote>
<p>自动装箱是 Java 编译器在<code>基本数据类型</code>和对应的<code>对象包装类型</code>之间做的一个转化</p>
<p>比如：把 int 转化成 Integer，double 转化成 Double 等等。反之就是自动拆箱。</p>
<p>原始类型: boolean，char，byte，short，int，long，float，double</p>
<p>封装类型：Boolean，Character，Byte，Short，Integer，Long，Float，Double</p>
</blockquote>
<h5 id="3、String是基本数据类型吗"><a href="#3、String是基本数据类型吗" class="headerlink" title="3、String是基本数据类型吗?"></a>3、String是基本数据类型吗?</h5><blockquote>
<p>基本数据类型包括byte、short、int、char、long、float、double和boolean。 </p>
<p>所以String不是基本数据类型。</p>
</blockquote>
<h5 id="4、String类型可变吗？"><a href="#4、String类型可变吗？" class="headerlink" title="4、String类型可变吗？"></a>4、String类型可变吗？</h5><blockquote>
<p>不可变</p>
<p>String类声明为final类，不可被继承</p>
<p>String内部的属性都是私有的，并且没有提供可供修改操作的方法，所以String是不可变的</p>
<p>而对于字符串的操作，每次都是  new String()</p>
</blockquote>
<h5 id="5、String-和-StringBuffer-和-StringBuilder的区别？"><a href="#5、String-和-StringBuffer-和-StringBuilder的区别？" class="headerlink" title="5、String 和 StringBuffer 和 StringBuilder的区别？"></a>5、String 和 StringBuffer 和 StringBuilder的区别？</h5><blockquote>
<p><strong>String 字符串常量<br>StringBuffer 字符串变量（线程安全）<br>StringBuilder 字符串变量（非线程安全）</strong></p>
<p>String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象，然后将指针指向新的 String 对象，所以经常改变内容的字符串最好不要用 String </p>
<p> StringBuffer 对象会对本身进行操作，而不是生成新的对象，再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ，特别是字符串对象经常改变的情况下</p>
<p>StringBuilder是一个新增的可变的字符序列，不保证同步，被设计用作 StringBuffer 的一个简易替换，用在字符串缓冲区被<strong>单个线程</strong>使用的时候</p>
</blockquote>
<h5 id="6、-比较的是什么？-equals-方法是如何比较的？两者区别？"><a href="#6、-比较的是什么？-equals-方法是如何比较的？两者区别？" class="headerlink" title="6、==比较的是什么？ equals()方法是如何比较的？两者区别？"></a>6、==比较的是什么？ equals()方法是如何比较的？两者区别？</h5><blockquote>
<p>”==“ 两边如果是两个<strong>对象</strong>基于<strong>内存引用</strong>， 两边如果是<strong>基本类型</strong>，就是比较<strong>数值</strong>是否相等</p>
<p>”equals()“ 比较的是 <strong>对象的地址</strong> ， 可以进行重写</p>
</blockquote>
<h5 id="7、-amp-和-amp-amp-的区别？"><a href="#7、-amp-和-amp-amp-的区别？" class="headerlink" title="7、&amp;和&amp;&amp;的区别？"></a>7、&amp;和&amp;&amp;的区别？</h5><blockquote>
<p>&amp;运算符有两种用法：(1)按位与；(2)逻辑与。&amp;&amp;运算符是短路与运算。</p>
<p>二者都要求运算符左右两端的布尔值都是 true 整个表达式的值才是true</p>
<p>&amp;&amp;之所以称为短路运算是因为，如果&amp;&amp;左边的表达式的值是 false，右边的表达式会被直接短路掉，不会进行运算。</p>
<p>而对于 &amp; ： 即使左边的表达式的值是 false ，右边还是会继续运算。</p>
</blockquote>
<h5 id="8、什么是面向对象？"><a href="#8、什么是面向对象？" class="headerlink" title="8、什么是面向对象？"></a>8、什么是面向对象？</h5><blockquote>
<p>简单点的例子来区分面向过程和面向对象</p>
<p>有一天你想吃一道菜，你有两个选择</p>
<p>1、自己买材料、菜、调料等等然后自己开火、洗菜、做饭，最后盛到盘子里。</p>
<p>2、去饭店，张开嘴：来一份xxxx！</p>
<p>这上面，1是面向过程，2是面向对象。</p>
<p>对于面向对象，1、你想吃菜了，你只负责提出想吃和去吃，餐馆才是负责做菜的，你不需要知道怎么做，<strong>降低了耦合性</strong>；2、你如果突然想吃别的了，对于面向过程你需要重新出门买菜，而对于面向对象，你只需要让饭店给你换一下菜，<strong>提高了可维护性</strong>。</p>
<p><strong>面向过程是具体化的，流程化的，解决一个问题，你需要一步一步的分析，一步一步的实现。</strong></p>
<p><strong>面向对象是模型化的，需要什么功能，可以进行封装，直接使用就可以了，不必去一步一步的实现，至于这个功能是如何实现的，不需要管，只需要使用</strong></p>
<p><strong>面向过程</strong></p>
<p>优点：性能比面向对象好，因为类调用时需要实例化，开销比较大，比较消耗资源。<br>缺点：不易维护、不易复用、不易扩展</p>
<p><strong>面向对象</strong></p>
<p>优点：易维护、易复用、易扩展，可以设计出低耦合的系统，使系统 更加灵活、更加易于维护<br>缺点：性能比面向过程差</p>
</blockquote>
<h5 id="9、Java的四个基本特性？"><a href="#9、Java的四个基本特性？" class="headerlink" title="9、Java的四个基本特性？"></a>9、Java的四个基本特性？</h5><blockquote>
<p><strong>封装</strong>：就是把对象的属性和行为（数据）结合为一个独立的整体，并尽可能隐藏对象的内部实现细节，就是把不想告诉或者不该告诉别人的东西隐藏起来，把可以告诉别人的公开，别人只能用我提供的功能实现需求，而不知道是如何实现的。增加安全性。<br><strong>继承</strong>：子类继承父类的数据属性和行为，并能根据自己的需求扩展出新的行为，提高了代码的复用性。<br><strong>多态</strong>：指允许不同的对象对同一消息做出相应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式（发送消息就是函数调用）。封装和继承几乎都是为多态而准备的，在执行期间判断引用对象的实际类型，根据其实际的类型调用其相应的方法。<br><strong>抽象</strong>:表示对问题领域进行分析、设计中得出的抽象的概念，是对一系列看上去不同，但是本质上相同的具体概念的抽象。在Java中抽象用 abstract 关键字来修饰，用 abstract 修饰类时，此类就不能被实例化，抽象类（接口）就是为了继承而存在的。</p>
</blockquote>
<h5 id="10、接口与继承的区别有？"><a href="#10、接口与继承的区别有？" class="headerlink" title="10、接口与继承的区别有？"></a>10、接口与继承的区别有？</h5><blockquote>
<p>1.不同的关键字，即实现接口（implements），继承（extends）；</p>
<p>2.在面向对象编程的时候只能是单继承，但是实现接口可以有多个，这说明了继承在Java中具有单根性，子类只能去继承一个父类；</p>
<p>3.在接口中只能定义全局变量和抽象方法，而在继承中可以定义属性方法，变量，常量等</p>
<p>4.当某个接口被实现的时候，在类中一定要用接口中的抽象方法，而继承中子类能随意调用父类的属性和方法</p>
</blockquote>
<h5 id="11、重载和重写的区别？"><a href="#11、重载和重写的区别？" class="headerlink" title="11、重载和重写的区别？"></a>11、重载和重写的区别？</h5><blockquote>
<p><strong>方法的重载和重写都是实现多态的方式，区别在于前者实现的是编译时的多态性，而后者实现的是运行时的多态性。</strong></p>
<p><strong>override（重写）</strong></p>
<p>　　 1、方法名、参数、返回值相同。</p>
<p>　　 2、子类方法不能缩小父类方法的访问权限。</p>
<p>　　 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。</p>
<p>　　 4、存在于父类和子类之间。</p>
<p>　　 5、方法被定义为final不能被重写。</p>
<p><strong>overload（重载）</strong></p>
<p>　　1、参数类型、个数、顺序至少有一个不相同。 </p>
<p>　　2、重载不能只根据返回类型进行区分</p>
<p>　　3、存在于父类和子类、同类中。</p>
</blockquote>
<h5 id="12、abstract-class-和-interface-有什么区别"><a href="#12、abstract-class-和-interface-有什么区别" class="headerlink" title="12、abstract class 和 interface 有什么区别?"></a>12、abstract class 和 interface 有什么区别?</h5><blockquote>
<p><strong>1.抽象类可以有构造方法，接口中不能有构造方法。</strong></p>
<p>2.抽象类中可以有普通成员变量，接口中没有普通成员变量</p>
<p><strong>3.抽象类中可以包含非抽象的普通方法，接口中的所有方法必须都是抽象的，不能有非抽象的普通方法。</strong></p>
<p>4.抽象类中的抽象方法的访问类型可以是public，protected，但接口中的抽象方法只能是public类型的</p>
<p><strong>5.抽象类中可以包含静态方法，接口中不能包含静态方法</strong></p>
<p><strong>6.抽象类和接口中都可以包含静态成员变量，抽象类中的静态成员变量的访问类型可以任意，但接口中定义的变量只能是public static final类型，并且默认即为public static final类型</strong></p>
<p><strong>7.一个类可以实现多个接口，但只能继承一个抽象类</strong></p>
</blockquote>
<h5 id="13、Java-中是否可以覆盖-override-一个-private-或者是-static-的方法？"><a href="#13、Java-中是否可以覆盖-override-一个-private-或者是-static-的方法？" class="headerlink" title="13、Java 中是否可以覆盖(override)一个 private 或者是 static 的方法？"></a>13、Java 中是否可以覆盖(override)一个 private 或者是 static 的方法？</h5><blockquote>
<p><strong>不可以</strong></p>
<ol>
<li><p>override：子类重写父类的方法（返回值，方法名，参数都相同）以实现多态。</p>
</li>
<li><p><strong>private只能够被自身类访问，子类不能访问private修饰的成员</strong>，所以不能override一个private方法</p>
</li>
<li><p>static方法是与类绑定的与任何实例都无关，随着类的加载而加载， <strong>static是编译时静态绑定的，override是运行时动态绑定的。</strong></p>
</li>
</ol>
</blockquote>
<h5 id="14、final、finally、finalize的区别"><a href="#14、final、finally、finalize的区别" class="headerlink" title="14、final、finally、finalize的区别"></a>14、final、finally、finalize的区别</h5><blockquote>
<p><strong>final</strong> 用于声明属性，方法和类，分别表示属性不可变，方法不可覆盖，类不可继承<br><strong>finally</strong> 是异常处理语句结构的一部分，表示总是执行<br><strong>finalize</strong>  是Object 类的一个方法，在垃圾收集器执行的时候会调用被回收对象的此方法，可以覆盖此方法提供垃圾收集时的其他资源回收，例如关闭文件等</p>
</blockquote>
<h5 id="15、Object-中有哪些方法？"><a href="#15、Object-中有哪些方法？" class="headerlink" title="15、Object 中有哪些方法？"></a>15、Object 中有哪些方法？</h5><blockquote>
<ol>
<li><strong>getClass()</strong> : final方法，获得运行时类型</li>
<li><strong>hashCode()</strong> ：该方法用于哈希查找，重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到</li>
<li><strong>equals()</strong> ：该方法是非常重要的一个方法。一般equals和==是不一样的，但是在Object中两者是一样的。子类一般都要重写这个方法。</li>
<li><strong>toString()</strong> : 转换为String类型</li>
<li><strong>clone()</strong> : 保护方法，实现对象的浅复制，只有实现了Cloneable接口才可以调用该方法，否则抛出CloneNotSupportedException异常</li>
<li><strong>wait()</strong> ：wait方法就是使当前线程等待该对象的锁，当前线程必须是该对象的拥有者，也就是具有该对象的锁。wait()方法一直等待，直到获得锁或者被中断。wait(long timeout)设定一个超时间隔，如果在规定时间内没有获得锁就返回</li>
<li><strong>notify()</strong> ：该方法唤醒在该对象上等待的某个线程</li>
<li><strong>notifyAll()</strong> ：该方法唤醒在该对象上等待的所有线程</li>
<li><strong>finalize()</strong> ：该方法用于释放资源。因为无法确定该方法什么时候被调用，很少使用</li>
</ol>
</blockquote>
<h5 id="16、怎么实现一个对象的克隆-Java如何实现深度克隆？"><a href="#16、怎么实现一个对象的克隆-Java如何实现深度克隆？" class="headerlink" title="16、怎么实现一个对象的克隆,Java如何实现深度克隆？"></a>16、怎么实现一个对象的克隆,Java如何实现深度克隆？</h5><blockquote>
<p><code>clone</code>是浅拷贝;只克隆了自身对象和对象内实例变量的地址引用,使用它需要实现接口<code>Cloneable</code>;</p>
<p>使用<code>ObjectStream</code>进行深度克隆; 先将对象序列化；然后再反序列化;</p>
</blockquote>
<p><strong>17、sleep() 区间wait()区间有什么区别？</strong></p>
<blockquote>
<p><strong>sleep()</strong> 是Thread中的方法,线程暂停,让出CPU,但是不释放锁</p>
<p><strong>wait()</strong> 是Object中的方法, 调用次方法必须让当前线程必须拥有此对象的锁 ,执行之后 线程阻塞,让出CPU, 同时也释放锁; 等待期间不配拥有CPU执行权, 必须调用 <strong>notify/notifyAll</strong> 方法唤醒,(notify是随机唤醒) 唤醒并不意味着里面就会执行,而是还是需要等待分配到CPU才会执行；</p>
</blockquote>
<h5 id="18、-amp-和-amp-amp-的区别？"><a href="#18、-amp-和-amp-amp-的区别？" class="headerlink" title="18、&amp;和&amp;&amp;的区别？"></a>18、&amp;和&amp;&amp;的区别？</h5><blockquote>
<p>&amp;运算符有两种用法：(1)按位与；(2)逻辑与</p>
<p>&amp;&amp;运算符是短路与运算</p>
<p>逻辑与跟短路与的差别是非常巨大的，虽然二者都要求运算符<strong>左右两端的布尔值都是 true 整个表达式的值才是true</strong>。&amp;&amp;之所以称为短路运算是因为，如果&amp;&amp;<strong>左边的表达式的值是 false，右边的表达式会被直接短路掉，不会进行运算</strong>。</p>
</blockquote>
<h5 id="19、Java-反射"><a href="#19、Java-反射" class="headerlink" title="19、Java 反射"></a>19、Java 反射</h5><blockquote>
<p>可以动态获取的信息以及动态调用对象的方法的功能，反射机制是在运行时，对于任意一个类， 都能够知道这个类的所有属性和方法；对于任意个对象，都能够调用它的任意一个方法。在java中，只要给定类的名字，就可以通过反射机制来获得类的所有信息。</p>
</blockquote>
<p><strong>20、Java反射创建对象效率高还是通过new创建对象的效率高？</strong></p>
<blockquote>
<p>通过new创建对象的效率比较高。通过反射时，先找查找类资源，使用类加载器创建，过程比较繁琐，所以效率较低。</p>
</blockquote>
<p><strong>21、return和finally同时出现时，会怎么样？</strong></p>
<blockquote>
<p><strong>1.在finally中有return,那么结果就返回finally中的</strong><br><strong>2.在finally中没有return,那么结果就是try和catch中的</strong></p>
<p>在实际开发过程中,一般在finally中是没有return的,因为如果finally中有return语句,那么try和catch中的return就没有作用,一般在开发的过程中,finally中一般只写一些关于资源释放,资源回收的代码.</p>
</blockquote>
<h5 id="21、-Error-和-Exception-区别是什么？"><a href="#21、-Error-和-Exception-区别是什么？" class="headerlink" title="21、 Error 和 Exception 区别是什么？"></a>21、 Error 和 Exception 区别是什么？</h5><blockquote>
<p><strong>Error</strong> 类型的错误通常为虚拟机相关错误，如系统崩溃，内存不足，堆栈溢出等，编译器不会对这类错误进行检测，也不应对这类错误进行捕获，<strong>一旦这类错误发生，通常应用程序会被终止，仅靠应用程序本身无法恢复；</strong></p>
<p><strong>Exception</strong> 类的错误是可以在应用程序中进行捕获并处理的，通常遇到这种错误，<strong>应对其进行处理，使应用程序可以继续正常运行。</strong></p>
</blockquote>
<p><strong>22、throw 和 throws 的区别是什么？</strong></p>
<blockquote>
<p><strong>throw</strong> 关键字用在方法内部，只能用于抛出一种异常，用来抛出方法或代码块中的异常，受查异常和非受查异常都可以被抛出。<br><strong>throws</strong> 关键字用在方法声明上，可以抛出多个异常，用来标识该方法可能抛出的异常列表。一个方法用 throws 标识了可能抛出的异常列表，调用该方法的方法中必须包含可处理异常的代码，否则也要在方法签名中用 throws 关键字声明相应的异常。</p>
</blockquote>
<p><strong>23、Java常见异常有哪些？</strong></p>
<blockquote>
<p><strong>ArrayIndexOutOfBoundsException</strong>：数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。</p>
<p><strong>IndexOutOfBoundsException</strong>：索引越界异常。当访问某个序列的索引值小于0或大于等于序列大小时，抛出该异常。</p>
<p><strong>NullPointerException</strong>：空指针异常。当应用试图在要求使用对象的地方使用了null时，抛出该异常。譬如：调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。</p>
<p><strong>StringIndexOutOfBoundsException</strong>：字符串索引越界异常。当使用索引值访问某个字符串中的字符，而该索引值小于0或大于等于序列大小时，抛出该异常。</p>
<p><strong>ClassNotFoundException</strong>：找不到类异常。当应用试图根据字符串形式的类名构造类，而在遍历CLASSPAH之后找不到对应名称的class文件时，抛出该异常。</p>
</blockquote>
<h5 id="24、-值传递与引用传递"><a href="#24、-值传递与引用传递" class="headerlink" title="24、 值传递与引用传递"></a>24、 值传递与引用传递</h5><blockquote>
<p><strong>值传递</strong>是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量</p>
<p><strong>引用传递</strong>一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 </p>
<p>一般认为 , <strong>java 内的传递都是值传递. java 中实例对象的传递是引用传递</strong></p>
</blockquote>
<h5 id="25、-什么是泛型？-泛型-？与-T-的区别"><a href="#25、-什么是泛型？-泛型-？与-T-的区别" class="headerlink" title="25、 什么是泛型？  泛型 ？与 T 的区别"></a>25、 什么是泛型？  泛型 ？与 T 的区别</h5><blockquote>
<p>”泛型”字面意思就是广泛的类型，类、接口和方法代码可以应用于非常广泛的类型，<strong>代码与它们能够操作的数据类型不再绑定在一起，同一套代码，可以用于多种数据类型</strong>，不仅可以<strong>复用代码，降低耦合</strong>，同时，还可以<strong>提高代码的可读性和安全性</strong>。</p>
<p>使用方法：</p>
<ol>
<li><T>  ，创建时就指定了数据类型，不可以在此基础上加入不同的数据类型</li>
<li><?>  ，？可以表示成占位符，表明存放N种数据类型也是可以的，可以开始时不用指定数据类型</li>
<li><? extends 数据类型> ，这种写法表示只接收指定的数据类型和它的子类类型</li>
<li><? super 数据类型> ，这种写法表示只接收指定的数据类型及它的父类类型
</li>
</ol>
</blockquote>
<h5 id="26、六原则一法则"><a href="#26、六原则一法则" class="headerlink" title="26、六原则一法则"></a>26、六原则一法则</h5><blockquote>
<ul>
<li><p><strong>单一职责原则</strong>：<strong>一个类只做它该做的事情</strong>。只让一个类完成它该做的事，而不涉及与它无关的领域就是践行了高内聚的原则，这个类就只有单一职责。</p>
</li>
<li><p><strong>开闭原则</strong>：<strong>软件实体应当对扩展开放，对修改关闭</strong>。要做到开闭有两个要点：①抽象是关键，一个系统中如果没有抽象类或接口系统就没有扩展点；②封装可变性，将系统中的各种可变因素封装到一个继承结构中，如果多个可变因素混杂在一起，系统将变得复杂而换乱，</p>
</li>
<li><p><strong>依赖倒转原则</strong>：面向接口编程。声明方法的参数类型、方法的返回类型、变量的引用类型时，<strong>尽可能使用抽象类型而不用具体类型</strong>，因为抽象类型可以被它的任何一个子类型所替代</p>
</li>
<li><p><strong>里氏替换原则</strong>：<strong>任何时候都可以用子类型替换掉父类型</strong>。里氏替换原则可以检查继承关系是否合理，如果一个继承关系违背了里氏替换原则，那么这个继承关系一定是错误的。例如让猫继承狗，或者让正方形继承长方形，需要注意的是：<strong>子类一定是增加父类的能力而不是减少父类的能力，因为子类比父类的能力更多，把能力多的对象当成能力少的对象来用当然没有任何问题。</strong></p>
</li>
<li><p><strong>接口隔离原则</strong>：<strong>接口要小而专，绝不能大而全</strong>。臃肿的接口是对接口的污染，既然接口表示能力，那么一个接口只应该描述一种能力，接口也应该是高度内聚的。</p>
</li>
<li><p><strong>合成聚合复用原则</strong>：<strong>优先使用聚合或合成关系复用代码</strong>。类与类之间简单的说有三种关系，分别是<strong>继承、关联和依赖</strong>。合成聚合复用原则想表达的是优先考虑 关联 关系而不是 继承 关系复用代码。<strong>任何时候都不要继承工具类，工具是可以拥有并可以使用的，而不是拿来继承的。</strong></p>
</li>
<li><p><strong>迪米特法则</strong>：又叫最少知识原则，<strong>一个对象应当对其他对象有尽可能少的了解</strong>。再复杂的系统都可以为用户提供一个简单的门面，浏览器对服务器的运作方式一无所知，但是通过前端控制器就能够根据你的请求得到相应的服务，这样就减小了系统的耦合度和复杂度。</p>
</li>
</ul>
</blockquote>
<h5 id="27、序列化"><a href="#27、序列化" class="headerlink" title="27、序列化"></a>27、序列化</h5><blockquote>
<p>将那些实现了<strong>Seralizable</strong> 接口的对象特揽成一个字节序列，并能够在以后将这个字节序列完全恢复为原来的对象，序列化可以弥补不同操作系统之间的差异</p>
</blockquote>
<h5 id="28、comparable-接口和-comparator-接口"><a href="#28、comparable-接口和-comparator-接口" class="headerlink" title="28、comparable 接口和 comparator 接口"></a>28、comparable 接口和 comparator 接口</h5><blockquote>
<p>Java 提供了只包含一个 **compareTo()**方法的 Comparable 接口。这个方法可以个给两个对象排序。具体来说，它返回负数，0，正数来表明输入对象小于，等于，大于已经存在的对象。<br>Java 提供了包含 **compare()和 equals()**两个方法的 Comparator 接口。compare()方法用来给两个输入参数排序，返回负数，0，正数表明第一个参数是小于，等于，大于第二个参数。equals()方法需要一个对象作为参数，它用来决定输入参数是否和 comparator 相等。只有当输入参数也是一个 comparator 并且输入参数和当前 comparator 的排序结果是相同的时候，这个方法才返回true。</p>
</blockquote>
<h5 id="29、字节流、字符流-区别"><a href="#29、字节流、字符流-区别" class="headerlink" title="29、字节流、字符流 区别"></a>29、字节流、字符流 区别</h5><blockquote>
<p>在程序中所有的数据都是以流的方式进行传输或保存的，程序需要数据的时候要使用输入流读取数据，而当程序需要将一些数据保存起来的时候，就要使用输出流完成。</p>
<p><strong>程序中的输入输出都是以流的形式保存的，流中保存的实际上全都是字节文件。</strong></p>
<p>在<strong>字节流</strong>中输出数据主要是使用OutputStream完成，输入使的是InputStream，</p>
<p>在<strong>字符流</strong>中输出主要是使用Writer类完成，输入流主要使用Reader类完成。</p>
</blockquote>
<h5 id="30、Comparable-和-Comparator-接口是干什么的？"><a href="#30、Comparable-和-Comparator-接口是干什么的？" class="headerlink" title="30、Comparable 和 Comparator 接口是干什么的？"></a>30、Comparable 和 Comparator 接口是干什么的？</h5><blockquote>
<p>Java 提供了只包含一个 <strong>compareTo()</strong> 方法的 <strong>Comparable</strong> 接口。这个方法可以个给两个对象排序。它返回 负数，0，正数 来表明输入对象小于，等于，大于已经存在的对象。<br>Java 提供了包含 <strong>compare()</strong> 和 <strong>equals()</strong> 两个方法的 <strong>Comparator</strong> 接口。compare()方法用来给两个输入参数排序，返回 负数，0，正数 表明第一个参数是小于，等于，大于第二个参数。equals()方法需要一个对象作为参数，a.equals(b) 它用来决定 b 是否和 a 相等。</p>
</blockquote>
</div><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta">文章作者: </span><span class="post-copyright-info"><a href="mailto:undefined">MoYu-zc</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta">文章链接: </span><span class="post-copyright-info"><a href="http://example.com/2021/06/23/%E5%85%AB%E8%82%A1%E6%96%87%20---%20Java%E5%9F%BA%E7%A1%80/">http://example.com/2021/06/23/八股文 --- Java基础/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta">版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外，均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来自 <a href="http://example.com" target="_blank">FATE</a>！</span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/Java%E5%9F%BA%E7%A1%80/">Java基础</a><a class="post-meta__tags" href="/tags/%E9%9D%A2%E8%AF%95/">面试</a></div><div class="post_share"><div class="social-share" data-image="https://gitee.com/MoYu-zc/picgo/raw/master/img/20210219145449.jpg" data-sites="facebook,twitter,wechat,weibo,qq"></div><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/social-share.js/dist/css/share.min.css"><script src="https://cdn.jsdelivr.net/npm/social-share.js/dist/js/social-share.min.js" defer></script></div></div><div class="post-reward"><div class="reward-button"><i class="fas fa-qrcode"></i> 打赏<div class="reward-main"><ul class="reward-all"><li class="reward-item"><a href="/img/wx.png" target="_blank"><img class="post-qr-code-img" data-lazy-src="/img/wx.png" alt="wechat"/></a><div class="post-qr-code-desc">wechat</div></li><li class="reward-item"><a href="/img/zfb.jpg" target="_blank"><img class="post-qr-code-img" data-lazy-src="/img/zfb.jpg" alt="alipay"/></a><div class="post-qr-code-desc">alipay</div></li></ul></div></div></div><nav class="pagination-post" id="pagination"><div class="prev-post pull-left"><a href="/2021/06/24/10.%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%90%88%E9%9B%86/"><img class="prev-cover" data-lazy-src="https://gitee.com/MoYu-zc/picgo/raw/master/img/20210208190913.jpeg" onerror="onerror=null;src='/img/404.jpg'"><div class="pagination-info"><div class="label">上一篇</div><div class="prev_info">数据结构合集</div></div></a></div><div class="next-post pull-right"><a href="/2021/05/30/09.Redis%E5%90%88%E9%9B%86/"><img class="next-cover" data-lazy-src="https://gitee.com/MoYu-zc/picgo/raw/master/img/20210217161659.jpg" onerror="onerror=null;src='/img/404.jpg'"><div class="pagination-info"><div class="label">下一篇</div><div class="next_info">Redis合集</div></div></a></div></nav><hr/><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i><span> 评论</span></div></div><div class="comment-wrap"><div><div class="vcomment" id="vcomment"></div></div></div></div></article></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2020 - 2022 By MoYu-zc</div><div class="footer_custom_text">Welcome,This is MoYu</div><div class="icp"><a target="_blank" rel="noopener" href="http://www.beian.gov.cn"><img class="icp-icon" src="/img/icp.png"/><span>豫ICP备20001029号</span></a></div></div></footer></div><section id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="translateLink" type="button" title="简繁转换">繁</button><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button></div><div id="rightside-config-show"><button id="rightside_config" type="button" title="设置"><i class="fas fa-cog"></i></button><a id="to_comment" href="#post-comment" title="直达评论"><i class="fas fa-comments"></i></a><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><button id="chat_btn" type="button" title="rightside.chat_btn"><i class="fas fa-sms"></i></button><button id="go-up" type="button" title="回到顶部"><i class="fas fa-arrow-up"></i></button></div></section><div class="search-dialog" id="local-search"><div class="search-dialog__title" id="local-search-title">本地搜索</div><div id="local-input-panel"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div></div><hr/><div id="local-search-results"><div id="local-hits"></div><div id="local-stats"><div class="local-search-stats__hr" id="hr"><span>由</span> <a target="_blank" rel="noopener" href="https://github.com/wzpan/hexo-generator-search" style="color:#49B1F5;">hexo-generator-search</a>
 <span>提供支持</span></div></div></div><span class="search-close-button"><i class="fas fa-times"></i></span></div><div id="search-mask"></div><div><script src="https://cdn.jsdelivr.net/npm/jquery@latest/dist/jquery.min.js"></script><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@latest/dist/jquery.fancybox.min.js"></script><script src="https://cdn.jsdelivr.net/npm/vanilla-lazyload/dist/lazyload.iife.min.js"></script><script src="https://cdn.jsdelivr.net/npm/node-snackbar/dist/snackbar.min.js"></script><script src="/js/search/local-search.js"></script><div class="js-pjax"><script>if (document.getElementsByClassName('mermaid').length) {
  if (window.mermaidJsLoad) mermaid.init()
  else {
    $.getScript('https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js', function () {
      window.mermaidJsLoad = true
      mermaid.initialize({
        theme: 'default',
      })
      false && mermaid.init()
    })
  }
}</script><script>function loadValine () {
  function initValine () {
    const initData = {
      el: '#vcomment',
      appId: 'uANjuzIND1m5J2AmUxp5cG6K-gzGzoHsz',
      appKey: '4ViTsc6RFpqLm1PtCIlXh5m7',
      placeholder: '请留下你的疑问、评论，我会很快回复滴~~',
      avatar: 'monsterid',
      meta: 'nick,mail,link'.split(','),
      pageSize: '10',
      lang: 'zh-CN',
      recordIP: true,
      serverURLs: '',
      emojiCDN: '',
      emojiMaps: "",
      enableQQ: true,
      path: window.location.pathname,
    }

    if (true) { 
      initData.requiredFields= ('nick,mail'.split(','))
    }

    const valine = new Valine(initData)
  }

  if (typeof Valine === 'function') initValine() 
  else $.getScript('https://cdn.jsdelivr.net/npm/valine/dist/Valine.min.js', initValine)
}

if ('Valine' === 'Valine' || !true) {
  if (true) btf.loadComment(document.querySelector('#vcomment'),loadValine)
  else setTimeout(() => loadValine(), 0)
} else {
  function loadOtherComment () {
    loadValine()
  }
}</script><script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div><script type="text/javascript" src="/js/fairyDustCursor.js"></script><script defer="defer" id="fluttering_ribbon" mobile="true" src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/canvas-fluttering-ribbon.min.js"></script><script src="https://cdn.jsdelivr.net/npm/butterfly-extsrc@1/dist/activate-power-mode.min.js"></script><script>POWERMODE.colorful = true;
POWERMODE.shake = false;
POWERMODE.mobile = true;
document.body.addEventListener('input', POWERMODE);
</script><script>window.$crisp = [];
window.CRISP_WEBSITE_ID = "86484e26-1f47-4402-a211-1efa3b0a704e";
(function () {
  d = document;
  s = d.createElement("script");
  s.src = "https://client.crisp.chat/l.js";
  s.async = 1;
  d.getElementsByTagName("head")[0].appendChild(s);
})();
$crisp.push(["safe", true])

if (true) {
  $crisp.push(["do", "chat:hide"])
  $crisp.push(["on", "chat:closed", function() {
    $crisp.push(["do", "chat:hide"])
  }])
  var chatBtnFn = () => {
    var chatBtn = document.getElementById("chat_btn")
    chatBtn.addEventListener("click", function(){
      $crisp.push(["do", "chat:show"])
      $crisp.push(["do", "chat:open"])

    });
  }
  chatBtnFn()
} else {
  if (true) {
    function chatBtnHide () {
      $crisp.push(["do", "chat:hide"])
    }
    function chatBtnShow () {
      $crisp.push(["do", "chat:show"])
    }
  }
}</script></div></body></html>